package core.acceso;

import core.bd;
import core.constructor.constructor;
import java.awt.event.KeyEvent;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.UIManager;

/**
 *
 * @author PCGASO
 */
public class Acceso extends javax.swing.JFrame {


    /*
     * Solo se hara el cambio de Height una vez.
     * para ello se tiene que utilizar esta bandera
     * para que solo se ejecuta por primera vez y no se vuelva a
     * cambiar de tamaño
     */
    Boolean ed_flag = false;
    // Se Declara una variable de tipo Rectangle
    // Que almacenerara el Bounds de JFrame
    static java.awt.Rectangle bounds;

   
    constructor c;
    public Acceso() {
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        //Se instancia el objeto conexion con el nombre de la BD que vamos a utilizar
        //Asignamos los parametros de la conexion a con del objeto conexion y del tipo de
        //dato Connetion de con (conexion.con) que se encuentra en la clase Conexion.
        //Carga todas las reglas de la conexion

        lookAndFeel();
        initComponents();
        /*
         * Se Obtiene el Bounds actual
         * para redimencionar la Ventana cuando sea necesario
         */
        bounds = this.getBounds();
        setBounds(350, 250, 424, 259);
        this.setTitle("Autenticación de usuario");
        setResizable(false);
        //Centrar la ventana en la Pantalla
        this.setLocationRelativeTo(null);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        CPasswd = new javax.swing.JPasswordField();
        jButton1 = new javax.swing.JButton();
        BEntrar = new javax.swing.JButton();
        SALEEE = new javax.swing.JButton();
        PanelLogo = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        PanelColapsable = new org.jdesktop.swingx.JXCollapsiblePane();
        ed_MensajeError = new javax.swing.JLabel();
        CNombre = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel2.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel2.setText("Contraseña:");

        jLabel3.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        jLabel3.setText("Nombre");

        CPasswd.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        CPasswd.setText("limagu");
        CPasswd.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                CPasswdMouseClicked(evt);
            }
        });
        CPasswd.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                CPasswdFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt) {
                CPasswdFocusLost(evt);
            }
        });
        CPasswd.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                CPasswdKeyPressed(evt);
            }
        });

        jButton1.setText("<<");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        BEntrar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/core/img/Unlock-32.png"))); // NOI18N
        BEntrar.setText("Entrar");
        BEntrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BEntrarActionPerformed(evt);
            }
        });

        SALEEE.setIcon(new javax.swing.ImageIcon(getClass().getResource("/core/img/exit login.png"))); // NOI18N
        SALEEE.setText("Salir");
        SALEEE.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                SALEEEActionPerformed(evt);
            }
        });

        PanelLogo.setLayout(null);

        jLabel4.setFont(new java.awt.Font("Tahoma", 3, 36)); // NOI18N
        jLabel4.setForeground(new java.awt.Color(255, 255, 255));
        jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel4.setText("Acceso");
        jLabel4.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        PanelLogo.add(jLabel4);
        jLabel4.setBounds(140, 10, 160, 40);

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/core/img/Fondo_Login.png"))); // NOI18N
        PanelLogo.add(jLabel1);
        jLabel1.setBounds(10, 10, 400, 60);

        PanelColapsable.setCollapsed(true);

        ed_MensajeError.setBackground(new java.awt.Color(255, 235, 232));
        ed_MensajeError.setText("<html><strong>¡Atención!</strong><br>No se a podido Comprobar su Identidad.<br>Verifique Usuario o Contraseña</html>");
        ed_MensajeError.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 0, 0)));
        ed_MensajeError.setOpaque(true);

        javax.swing.GroupLayout PanelColapsableLayout = new javax.swing.GroupLayout(PanelColapsable.getContentPane());
        PanelColapsable.getContentPane().setLayout(PanelColapsableLayout);
        PanelColapsableLayout.setHorizontalGroup(
            PanelColapsableLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(ed_MensajeError, javax.swing.GroupLayout.DEFAULT_SIZE, 399, Short.MAX_VALUE)
        );
        PanelColapsableLayout.setVerticalGroup(
            PanelColapsableLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(ed_MensajeError, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        CNombre.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N
        CNombre.setText("limagu");
        CNombre.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                CNombreFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt) {
                CNombreFocusLost(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(28, 28, 28)
                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(BEntrar, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(SALEEE, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(13, 13, 13))
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(PanelLogo, javax.swing.GroupLayout.PREFERRED_SIZE, 420, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createSequentialGroup()
                                .addGap(90, 90, 90)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(CNombre, javax.swing.GroupLayout.DEFAULT_SIZE, 310, Short.MAX_VALUE)
                                    .addComponent(CPasswd, javax.swing.GroupLayout.DEFAULT_SIZE, 310, Short.MAX_VALUE)))))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(PanelColapsable, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(PanelLogo, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(CNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(12, 12, 12)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2)
                    .addComponent(CPasswd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(10, 10, 10)
                .addComponent(PanelColapsable, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(BEntrar, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(SALEEE, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void CPasswdMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_CPasswdMouseClicked
        //incorrecto.setVisible(false);
}//GEN-LAST:event_CPasswdMouseClicked

    private void CPasswdFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_CPasswdFocusGained
        CPasswd.setBackground(new java.awt.Color(255, 255, 213));
        CPasswd.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(255, 204, 0)));
}//GEN-LAST:event_CPasswdFocusGained

    private void CPasswdFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_CPasswdFocusLost
        CPasswd.setBackground(new java.awt.Color(255, 255, 255));
        CPasswd.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(171, 173, 179)));
}//GEN-LAST:event_CPasswdFocusLost

    private void CPasswdKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_CPasswdKeyPressed
        /*
         *  Validar la Tecla Enter para cuando se precione
         *  realice un Evento Dado.
         *
         */

        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            verificarusuario();
        }
}//GEN-LAST:event_CPasswdKeyPressed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        this.setVisible(false);
        c = new constructor();
        c.setVisible(true);
}//GEN-LAST:event_jButton1ActionPerformed

    private void BEntrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BEntrarActionPerformed

        // re_calcularBounds(30, false);
        //PanelColapsable.setCollapsed(true);

       verificarusuario();
    }//GEN-LAST:event_BEntrarActionPerformed

    private void SALEEEActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SALEEEActionPerformed

        // re_calcularBounds(30, true);
        // PanelColapsable.setCollapsed(false);
        System.exit(0);
}//GEN-LAST:event_SALEEEActionPerformed

    private void CNombreFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_CNombreFocusGained
        CNombre.setBackground(new java.awt.Color(255, 255, 213));
        CNombre.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(255, 204, 0)));
        PanelColapsable.setCollapsed(true);
}//GEN-LAST:event_CNombreFocusGained

    private void CNombreFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_CNombreFocusLost
        CNombre.setBackground(new java.awt.Color(255, 255, 255));
        CNombre.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(171, 173, 179)));
}//GEN-LAST:event_CNombreFocusLost

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Acceso().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton BEntrar;
    private javax.swing.JTextField CNombre;
    private javax.swing.JPasswordField CPasswd;
    private org.jdesktop.swingx.JXCollapsiblePane PanelColapsable;
    private javax.swing.JPanel PanelLogo;
    private javax.swing.JButton SALEEE;
    private javax.swing.JLabel ed_MensajeError;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    // End of variables declaration//GEN-END:variables

    /**
    @author  Gustavo Salgado
    @version 3.0
    @throws verificarusuario() Si exite problemas de conexion se lanzara una
     * exception de tipo SQL
     *

     * La funcion comprobarusuario() verifica
     * que los datos ingresados por el usuario ; correspondan
     * a un "usuario" valido del sistema para la utilizacion.
     * Esto se hace a través de una consulta que retorne un COUNT con
     * la condicion de los campos que el usuario digita.
     * Si el usuario existe la consulta retorna 1 y se hace
     * visible la ventana Principal,
     * de lo contrario no podra acceder al programa.
     *
     * @update 11/09/2010 La funcion ahora encripta la contraseña a MD5
     */
    private void verificarusuario() {

        /* Declaramos variables y le asignamos los valores
         * de los JtextField que van a recibir los datos
         * de logueo.
         */

        String user, passwd , rol="" ;
        user = CNombre.getText();
        char[] pwd = CPasswd.getPassword();
        passwd = tools.Util.encryptMD5(new String(pwd));

        System.out.println(passwd);

        /* Se preparan los Instamentos. El q
         * va a hacer la Consulta (chequear) y el instamento
         * que va a ejecutarla (resultado). Esto Aplica para los "Select"
         * */
        PreparedStatement chequear = null;
        ResultSet resultado = null;

        try {

            /* Se realiza la Consulta SQL a traves
             * del Estamento chequear para que haga una "cuenta"
             * del Numero de usuarios que coinsidan
             * los datos de contraseña y nombre de usuario
             */
            //se estan dejando las conexiones abiertas
            chequear = bd.getConexion().prepareStatement("SELECT COUNT(*) FROM usuario u WHERE u.usuario = ? AND u.clave = ? AND u.estado = 1 ");
            //chequear = con.prepareStatement("SELECT u.id , u.apodo FROM ed_usuarios u , ed_grupo_usuario  g WHERE u.id_grupo_usuario  = g.gu_id AND u.apodo = ? AND u.contrasena = ?");
            

            /* Estos String (user, passwd) seran
             * los que se le pasaran
             * a la consulta como interrogantes para
             * hacer la comparacion
             * */

            chequear.setString(1, user);
            chequear.setString(2, passwd);

            /* A traves del ResultSet resultado se
             * ejecutara lo consultado en chequear.
             * */

            resultado = chequear.executeQuery();

            resultado.next();

            /* A traves de este if se determinara si
             * al cumplir la condicion dada el usuario
             * es valido o no para acceder al programa.
             * */
            // Q tal si, por defecto lo dejas fallando.. es decir..
            // Algo asi

            System.out.println("ED => "+resultado.getString(1));
            if (Integer.parseInt(resultado.getString(1)) == 1) {
                
                chequear = bd.getConexion().prepareStatement("SELECT r.nombre FROM rol r , usuario u WHERE r.id = u.id_rol AND u.usuario = ?");
                chequear.setString(1, user);
                resultado = chequear.executeQuery();
                while(resultado.next()){
                    rol = resultado.getString(1);
                }
                
                //se estan dejando las conexiones abiertas
                chequear = bd.getConexion().prepareStatement("SELECT m.nombre , r.nombre FROM rol r , modulo m , permiso p , usuario u WHERE m.id = p.id_modulo AND r.id = p.id_rol AND r.id = u.id_rol AND u.usuario = ? ");
                chequear.setString(1, user);
                resultado = chequear.executeQuery();
                
                //Modulos Disponibles del Sistema
                List<String> modulos = new ArrayList<String>();
                
                while ( resultado.next()){
                    System.out.println(resultado.getString(1)  ) ;                                       
                    modulos.add(resultado.getString(1));
                }             
                
                
                PanelColapsable.setCollapsed(true);
                
                c = new constructor(modulos,rol,user);
                c.setVisible(true);
                this.dispose();
            } else {
                CPasswd.setText("");
                PanelColapsable.setCollapsed(false);
            }

            chequear.close();

        } catch (java.sql.SQLException e) {
            JOptionPane.showMessageDialog(this, "Hay un problema en el intento de logeo. Por favor Intentelo de nuevo", "ERROR", JOptionPane.ERROR_MESSAGE);
            System.err.println("Eror al intentar hacer el login: " + e);
        }

    }

    /**
     * Recalcula el tamaño del JFrame o JPanel para que
     * si es el caso cambie su Height si utiliza un PanelColapsable
     * @param ed_newHeight cantidad de posiciones que quiere que se mueva. (px)
     */
    void re_calcularBounds(Integer ed_newHeight, Boolean ed_isReCalcular) {




        if (ed_flag == false) {
            if (ed_isReCalcular) {

                this.setBounds((int) this.getX(), (int) this.getY(), (int) this.getWidth(), (int) this.getHeight() + ed_newHeight);


            }
            ed_flag = true;
        } else {

            this.setBounds(bounds);

            ed_flag = false;



        }



    }

    void lookAndFeel() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Imposible modificar el tema visual", "Lookandfeel invÃ¡lido.",
                                            JOptionPane.ERROR_MESSAGE);
        }
    }
}
